package com.tangbuzhi.singleton;

/**
 * Created by admin on 2017/10/11.
 */
public class Singleton3 {
    /**
     * 双重检查模式（DCL）
     * 这种写法对Singleton3进行了两次判空，第一次是为了不必要的同步，第二次是在Singleton3为null的情况下才创建实例
     * 在这里使用volatile会或多或少的影响性能，但考虑到程序的正确性，牺牲这点性能还是值得的
     * DCL的优点是资源利用率高，第一次执行getInstance时单例对象才能被实例化，效率高
     * 缺点是第一次加载时反应稍慢一些，在高并发环境下也有一定的缺陷
     * DCL虽然在一定程度上解决了资源的消耗和多余的同步、线程安全等问题，但其还是在某些情况会出现失效的问题，也就是DCL失效
     * 下面建议用静态内部类单例模式来替代DCL
     */
    private volatile static Singleton3 instance;

    private Singleton3() {
    }

    public static synchronized Singleton3 getInstance() {
        if (instance == null) {
            synchronized (Singleton3.class) {
                if (instance == null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}
